﻿using System.Globalization;
using System.Text;
using System.Web.Mvc;

namespace BoneSystem.Extensions.Annotations.InputTypeAnnotations
{
    public class AutoCompleteAttribute : InputAttribute
    {
        public AutoCompleteAttribute()
        {
            VarAutoCompleteModule = "autoCompleteModule";
        }
        // Extender InputAttribute para anotar as classes
        // "Settins" extender Settings
        // A propriedade Class da classe settings deve escrever o atributo inputclass
        /// <summary>
        /// Tempo de espera até que a consulta seja enviada ao servidor.
        /// </summary>
        public int Pause { get; set; }
        /// <summary>
        /// Url que irá receber o texto digitado pelo usuário, efetuar a consulta e retornar os dados da pesquisa.
        /// </summary>
        public string UrlData { get; set; }
        /// <summary>
        /// Url que retorna o template de exibição dos dados retornados pelo servidor.
        /// </summary>
        public string UrlTemplate { get; set; }
        /// <summary>
        /// Mínimo de caracteres para iniciar a consulta.
        /// </summary>
        public int MinLength { get; set; }
        /// <summary>
        /// Nome do campo que contém o valor a ser exibido no textbox.
        /// </summary>
        public string TextField { get; set; }
        /// <summary>
        /// Item selecionado após consulta.
        /// </summary>
        public string SelectedItem { get; set; } // Nome do objeto no modelo que será substituido quando o item for selecionado.
        /// <summary>
        /// Nome da variável que contém o módulo onde a diretiva será declarada.
        /// </summary>
        public string VarAutoCompleteModule { get; set; }

        public string AutoCompleteName
        {
            get
            {
                return "acomp" + Name.ToLower();
            }
        }

        public override TagBuilder TagBuilder()
        {
            // Tags que não irão compor a saída da tag auto complete.
            NgModel = "";
            Required = false;
            Id = Name.Replace('.', '_') + "_value";

            var tagDiv = new TagBuilder("div");
            var tagAutoComplete = new TagBuilder(AutoCompleteName);

            foreach (var attribute in base.TagBuilder().Attributes)
            {
                if (!(attribute.Key.Contains("ng-model") ||
                    attribute.Key.Contains("class") ||
                    attribute.Key.Contains("value")))
                {
                    tagAutoComplete.Attributes[attribute.Key] = attribute.Value;
                }
            }

            tagAutoComplete.Attributes["pause"] = Pause.ToString(CultureInfo.InvariantCulture);
            tagAutoComplete.Attributes["minlength"] = MinLength.ToString(CultureInfo.InvariantCulture);
            tagAutoComplete.Attributes["textfield"] = TextField;
            tagAutoComplete.Attributes["urldata"] = UrlData;
            tagAutoComplete.Attributes["selecteditem"] = SelectedItem;
            tagAutoComplete.Attributes["inputclass"] = "form-control";

            tagDiv.InnerHtml = tagAutoComplete.ToString(TagRenderMode.Normal);
            return tagDiv;
        }

        public override StringBuilder GetScripts()
        {
            var build = base.GetScripts();
            build.Append(
                VarAutoCompleteModule + ".directive('" + AutoCompleteName + "', function ($parse, $http, $sce, $timeout) \n" +
                "{\n" +
                    "return montaAutoComplete($parse, $http, $sce, $timeout, '" +
                UrlTemplate + "');\n" +
                "});\n");
            return build;
        }
    }
}
